package com.qf.factory;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
import java.util.Properties;

public class BeanFactory2 {

    public static Object getBean(String id) throws Exception {
        Properties properties = new Properties();
        properties.load(BeanFactory2.class.getClassLoader().getResourceAsStream("bean.properties"));

        String className = properties.getProperty(id);

        Class<?> cls = Class.forName(className);

        Object obj = cls.newInstance();

        //返回增强功能后的代理对象,因为UserService没有实现接口，此时只能使用CGLib
        /*
            Class type: 指定生成的代理对象的类型（可以指定一个实现类类型,不要求接口类型）
            Callback callback：功能类似于JDK动态代理的InvocationHandler，封装增强逻辑。
                当我们调回动态代理对象的任何方法，最终都会调用这个Callback的intercept方法
         */
        Object proxy = Enhancer.create(cls, new MethodInterceptor() {
            /*
                Object o : 代理对象（一般不使用）
                Method method：代理对象调用的那个方法的反射对象形式
                Object[] objects：代理对象调用的那个方法的参数值
                MethodProxy methodProxy：代理对象中的那个方法,可以通过这个对象调用super的方法（很少使用）
             */
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                if (method.getName().startsWith("find")){
                    System.out.println("查询缓存~~");
                }
                return method.invoke(obj,objects);
            }
        });

        return proxy;
    }
}
